Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 5a388d80edd11ef4fcbeb6a7681aa7963c20559a


Parents : 176642d
Author : Sudo-Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-01-04T23:39:50-06:00

feat(logging): implement dynamic log directory resolution and add rotating file handler for improved logging management

Changes

1 files changed, 49 insertions(+), 3 deletions(-)


Diff

diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py
index 99eff2a9..39670801 100644
--- a/meshchatx/meshchat.py
+++ b/meshchatx/meshchat.py
@@ -35,6 +35,7 @@ from aiohttp import WSCloseCode, WSMessage, WSMsgType, web
from aiohttp_session import get_session
from aiohttp_session import setup as setup_session
from aiohttp_session.cookie_storage import EncryptedCookieStorage
+from logging.handlers import RotatingFileHandler
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
@@ -91,11 +92,56 @@ from meshchatx.src.version import __version__ as app_version
import logging
+def resolve_log_dir():
+ """Choose a writable log directory across container, desktop, and Windows."""
+ env_dir = os.environ.get("MESHCHAT_LOG_DIR")
+ candidates = []
+ if env_dir:
+ candidates.append(env_dir)
+
+ candidates.append("/config/logs")
+
+ if os.name == "nt":
+ appdata = os.environ.get("LOCALAPPDATA") or os.environ.get("APPDATA")
+ if appdata:
+ candidates.append(os.path.join(appdata, "MeshChatX", "logs"))
+
+ home_dir = os.path.expanduser("~")
+ candidates.append(os.path.join(home_dir, ".reticulum-meshchatx", "logs"))
+ candidates.append(os.path.join(tempfile.gettempdir(), "meshchatx", "logs"))
+
+ for path in candidates:
+ if not path:
+ continue
+ try:
+ os.makedirs(path, exist_ok=True)
+ return path
+ except PermissionError:
+ continue
+ except OSError:
+ continue
+
+ return None
+
+
# Global log handler
memory_log_handler = PersistentLogHandler()
-logging.basicConfig(
- level=logging.INFO, handlers=[memory_log_handler, logging.StreamHandler(sys.stdout)]
-)
+log_dir = resolve_log_dir()
+handlers = [memory_log_handler]
+
+if log_dir:
+ file_handler = RotatingFileHandler(
+ os.path.join(log_dir, "meshchatx.log"),
+ maxBytes=5 * 1024 * 1024,
+ backupCount=3,
+ encoding="utf-8",
+ )
+ handlers.append(file_handler)
+else:
+ handlers.append(logging.StreamHandler(sys.stdout))
+
+logging.basicConfig(level=logging.INFO, handlers=handlers)
+logging.getLogger("aiohttp.access").setLevel(logging.WARNING)
logger = logging.getLogger("meshchatx")


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────